#ifndef __WIZ_UTILS_DATUM_WRITER_HPP__SHANHAOBO_19800429__
#define __WIZ_UTILS_DATUM_WRITER_HPP__SHANHAOBO_19800429__

#include "../../Base/WizBase.hpp"
#include "../../DataType/WizDataType.hpp"

#include <iostream>

namespace Wiz
{
    namespace Datum
    {
        namespace Writer
        {
            struct Type
            {
            public:
                Type() : m_EndianType(::Wiz::Endian::Native::Test()), m_StreamPtr(WIZ_NULLPTR)
                {}
                Type(::Wiz::Endian::Type ET) : m_EndianType(ET), m_StreamPtr(WIZ_NULLPTR)
                {}
                virtual ~Type()
                {}
            public:
                ::Wiz::Endian::Type    m_EndianType;
                FILE*                   m_StreamPtr;
                //::std::ostream          m_Stream;
                /// Write to stream
                virtual ::Wiz::Bool::Type Write(::Wiz::Real32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Real64::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int8::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int16::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int64::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt8::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt16::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt64::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean8::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::String::In);
                /// Write to stream
                virtual ::Wiz::Bool::Type Write(::Wiz::Real32::InPtr, ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Real64::InPtr, ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int8::InPtr,   ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int16::InPtr,  ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int32::InPtr,  ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Int64::InPtr,  ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt8::InPtr,  ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt16::InPtr, ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt32::InPtr, ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::UInt64::InPtr, ::Wiz::Size32::In);
                virtual ::Wiz::Bool::Type Write(::Wiz::Boolean8::InPtr,  ::Wiz::Size32::In);
                /// Write Core
                virtual ::Wiz::Void::Type WriteData(::Wiz::Void::InPtr, ::Wiz::Size32::In, ::Wiz::Size32::In);
            };
            WIZ_DECLARE(::Wiz::Datum::Writer::Type);
        } /// end of namespace Writer
    } /// end of namespace Datum
} /// end of namespace Wiz

#endif /*__WIZ_UTILS_DATUM_WRITER_HPP__SHANHAOBO_19800429__*/
